package socket;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 聊天室客户端,写内容
 */
public class Client {
    /*
         java.net.Socket 套接字
         Socket封装了TCP协议的铜须细节，使用它可以与远端计算机建立TCP链接，并基于
         两条流的读写完成与远端计算机的数据交换

         我们可以将Socket想象为"电话"
      */

    private Socket socket;

    /*
    构造方法用于初始化客户端
     */
    public Client(){

        try {
            System.out.println("正在连接服务器");
                                    //localhost
                                    //176.125.55.210
            socket=new Socket("176.125.55.210",8088);//地址跟端口号
            System.out.println("与服务器建立连接");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 客户端开始工作的方法
     */
    public void start(){//将输入的内容传到服务端
        try {
            //启动用于读取来着服务端消息的线程
            ServerHandler handler=new ServerHandler();
            Thread t=new Thread(handler);
            t.setDaemon(true);
            t.start();

            /*
                Socket重要的方法:
                OutputStream getOutputStream()
                通过Socket获取一个字节输出流,通过该输出流写出的数据会发送给
                链接的远端计算机

             */
            OutputStream out= socket.getOutputStream();
            OutputStreamWriter osw=new OutputStreamWriter(out, StandardCharsets.UTF_8);
            BufferedWriter bw=new BufferedWriter(osw);
            PrintWriter pw=new PrintWriter(bw,true);


            Scanner sc=new Scanner(System.in);
            while (true){
                String outpu =sc.nextLine();
                if ("exit".equals(outpu)){
                    System.out.println("断开连接");
                   break;
                }

                while (true){
                    pw.println(outpu);

                }



            }

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                /*
                    Socket的close调用后,通过socket获取的流会被关闭.
                    并且会与对方进行TCP挥手操作
                 */
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args) {
        Client client=new Client();
        client.start();
    }


    /*
        用于读取来自服务端发送过来的消息
     */
    private class ServerHandler implements Runnable{
        public void run(){
            //通过socket获取输入流,当前服务器发送过来的消息
            try {
                InputStream in=socket.getInputStream();
                InputStreamReader isr=new InputStreamReader(in);
                BufferedReader br=new BufferedReader(isr);

                //循环读取服务器发送回来的每一行字符串
                String line;
                while ((line=br.readLine())!=null){
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

}
